package com.example.authsystem.security;

import com.example.authsystem.model.User;
import com.example.authsystem.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

import java.util.Collections;

/**
 * 自定义用户详情服务类
 * 实现Spring Security的UserDetailsService接口
 * 用于从数据库加载用户信息并转换为Spring Security可用的UserDetails对象
 * 是Spring Security认证过程中的核心组件
 */
@Service
public class CustomUserDetailsService implements UserDetailsService {

    /**
     * 用户数据访问层接口，用于查询用户信息
     */
    @Autowired
    private UserRepository userRepository;

    /**
     * 根据用户名加载用户详情
     * 从数据库查询用户，如果不存在则抛出异常，否则创建Spring Security的UserDetails对象
     * 
     * @param username 用户名，用于在数据库中查找用户
     * @return UserDetails对象，包含用户名、密码、权限等认证所需信息
     * @throws UsernameNotFoundException 当找不到指定用户名的用户时抛出
     */
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        // 从数据库查询用户，如果不存在则抛出UsernameNotFoundException异常
        User user = userRepository.findByUsername(username)
                .orElseThrow(() -> new UsernameNotFoundException("User not found with username: " + username));

        // 创建Spring Security的UserDetails对象，设置用户名、密码和权限
        // 注意：用户角色需要添加ROLE_前缀，这是Spring Security的约定
        return new org.springframework.security.core.userdetails.User(
                user.getUsername(),
                user.getPassword(),
                Collections.singletonList(new SimpleGrantedAuthority("ROLE_" + user.getRole()))
        );
    }
}